package base.generic;

import base.bean.Apple;
import base.bean.Fruit;
import base.bean.RedApple;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型通配符练习
 */
public class GenericDemo {

    public void extendsPractice() {
        //      上界通配符
        List<? extends Apple> applesList = new ArrayList<>();

//        applesList = new ArrayList<Fruit>();


        List<Fruit> fruitList = new ArrayList();
        List<RedApple> redAppleList = new ArrayList();

        redAppleList.add(new RedApple());


        //可以为Apple的子类           //// 赋值
        applesList = redAppleList;     //可以赋值 为 子类
//        applesList = fruitList;     // 异常  不可以赋值 为 父类
        //异常  说明不能为Apple的父类


        Fruit fruit01 = new Fruit();
        Apple apple01 = new Apple();
        RedApple redApple01 = new RedApple();


        fruit01 = apple01;
//        apple01= fruit01;   //异常  super类需要进行强转为子类   子类
        apple01 = (Apple) fruit01;
        Apple apple03 = (Apple) (new Fruit());
        Apple apple04 = (Apple) (new RedApple());


        //  add
//        applesList.add(fruit01);      // 异常 ， 不可以add其父类
//        applesList.add(redApple01);  // 异常 不能进行add 其子类,
//        applesList.add(apple01);      // 异常 ， 不可以add 父类强制转换类
//        applesList.add(apple03);      // 异常
//        applesList.add(apple04);      // 异常
//        applesList.add(new Apple());  // 异常

        // get
        RedApple redApple02 = (RedApple) applesList.get(0);
        Apple apple02 = applesList.get(0);                       //get --> Apple
        Fruit fruit02 = applesList.get(0);

    }

    // 上通配符 List<? extends T>  , 限制了其上限
    // 1， 可以赋值 == 其子类泛型，不可以赋值 == 其父类的泛型
    // 2，不可以对其泛型list add 数据
    // 2，可以获得其中的元素 ，


    public void superDemo() {
        //      下界通配符
        List<? super Apple> applesList;

        List<Fruit> fruitList = new ArrayList();
        List<RedApple> redAppleList = new ArrayList();


        Fruit fruit01 = new Fruit();
        Apple apple01 = new Apple();
        RedApple redApple01 = new RedApple();

        //赋值
        applesList = fruitList;          //可以 为super class
//        applesList = redAppleList;    //异常  不可为 子类


        //  add
//        applesList.add(fruit01);    //异常  不能add super类
        applesList.add(apple01);       //可以 add 子类
        applesList.add(redApple01);

        // get
        Fruit fruit02 = (Fruit) applesList.get(0);   //都必须转换，说明为object
        Apple apple02 = (Apple) applesList.get(0);
        RedApple redApple02 = (RedApple) applesList.get(0);


    }
    //  下通配符  List<? super T>  ，限制了下限
    //  1, 可以赋值 == 其父类的泛型，不可以赋值 == 其子类泛型
    //  2，可以list添加其子类，不可以add 添加父类
    //  3，可以get其中内容，获得内容object类型，必须转化





}
